package com.lins.store.config.filter;

import org.springframework.stereotype.Component;

import javax.servlet.*;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * 跨域配置
 */
//@Component
public class CORS_Filter implements Filter {

    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
        HttpServletResponse response = (HttpServletResponse) res;
        response.setHeader("Access-Control-Allow-Origin", "*");
        response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE, HEAD");
        response.setHeader("Access-Control-Max-Age", "3600");
        response.setHeader("Access-Control-Allow-Headers", "access-control-allow-origin, authority, content-type, version-info, X-Requested-With");
        chain.doFilter(req, res);
    }

    public void init(FilterConfig filterConfig) {}
    public void destroy() {}

    /**
     * 过滤器解决跨域问题：
     *      跨域：请求和响应都正常，是浏览器拒绝解析。
     *      CSRF攻击：
     *          A网站，验证通过，发放A的cookie。
     *          若不退出A而带着A的Cookie直接访问B网站，B拿到Cookie后可以向A网站发送某些请求(比如转账或恶意删除请求)，
     *          若A网站不对请求进行特殊的校验，则有安全隐患。
     *          <img><link><script>这些标签，允许加载跨域资源。
     *      解决：JSONP
     *          CROS非简单请求：正式请求之前，先发送options请求去询问服务器是否接受跨域请求(安全隐患的请求)携带以下Header:
     *              Origin:发起请求的原来的域，来自哪里。options请求（跨域预检）触发跨域属于复杂请求。
     *              Access-Control-Request-Method:将要发送跨域请求的方式，如GET/POST。
     *              Access-Control-Request-Header:将要发送跨域请求，包含的请求头字段。
     *          服务器在返回中增加Header以下信息，表明是都接受跨域请求。浏览器收到以后检查如果不符合则不会发送正式请求。
     *              Access-Control-Allow-Origin:允许哪些域来访问(*表示允许所有)
     *              Access-Control-Allow-Method:允许哪些请求方式
     *              Access-Control-Allow-Header:允许哪些请求头字段
     *              Access-Control-Allow-Credentials:是否允许携带Cookie
     */

//    @Bean
//    public CorsFilter corsFilter() {
//        //1. 添加 CORS配置信息
//        CorsConfiguration config = new CorsConfiguration();
//        //放行哪些原始域
//        config.addAllowedOrigin("*");
//        //是否发送 Cookie
//        config.setAllowCredentials(true);
//        //放行哪些请求方式
//        config.addAllowedMethod("*");
//        //放行哪些原始请求头部信息
//        config.addAllowedHeader("*");
//        //暴露哪些头部信息
//        config.addExposedHeader("*");
//        //2. 添加映射路径
//        UrlBasedCorsConfigurationSource corsConfigurationSource = new UrlBasedCorsConfigurationSource();
//        //允许
//        corsConfigurationSource.registerCorsConfiguration("/**",config);
//        //3. 返回新的CorsFilter
//        return new CorsFilter(corsConfigurationSource);
//    }
}
